package org.zhb.sys.core.config;

import org.springframework.amqp.core.AmqpAdmin;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Title: RabbitConfig.java
 * @Package com.zzh.sys.configuration
 * @Description: rabbit消息队列配置
 * @author zhb
 * @date 2016年3月6日 下午9:18:16
 * @version V1.0
 */
@Configuration
public class RabbitConfig {
	@Autowired
	// 客户端创建连接的工厂
	private ConnectionFactory connectionFactory;

	/**
	 * @Title: rubeExchange
	 * @Description: 交换机--看作是信息的生产者producer
	 * @return: DirectExchange
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:01:53
	 */
	public @Bean DirectExchange exchange() {
		// 参数1 --交换机名称 参数2 -- 是否持久化 参数3 ---是否自动删除
		return new DirectExchange("rmq.rube.exchange", true, false);
	}

	/**
	 * @Title: rubeQueue
	 * @Description: 队列--消费者通过queue来接收信息
	 * @return: Queue
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:03:16
	 */
	public @Bean Queue queue() {
		// 参数1 --队列的名称 参数2 --- 是否持久化
		return new Queue("rmq.rube.queue", true);
	}

	/**
	 * @Title: rubeExchangeBinding
	 * @Description: 将queue绑定到交换机 :也就是说将生产者端绑定到一个具体的队列,消费者就可以从此接收
	 * @return: Binding
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:08:32
	 */
	public @Bean Binding exchangeBinding() {
		return BindingBuilder.bind(queue()).to(exchange()).with("rube.key");
	}

	/**
	 * @Title: rubeExchangeTemplate
	 * @Description:返回操作模板
	 * @return: RabbitTemplate
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:08:54
	 */
	public @Bean RabbitTemplate rabbitTemplate() {
		RabbitTemplate rabbitTemplate = new RabbitTemplate(connectionFactory);
		rabbitTemplate.setExchange("rmq.rube.exchange");
		rabbitTemplate.setRoutingKey("rube.key");
		return rabbitTemplate;
	}

	/**
	 * @Title: rabbitMessagingTemplate
	 * @Description:消息模板
	 * @return: RabbitMessagingTemplate
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:09:39
	 */
	public @Bean RabbitMessagingTemplate rabbitMessagingTemplate() {
		return new RabbitMessagingTemplate(rabbitTemplate());
	}

	/**
	 * @Title: amqpAdmin
	 * @Description: 用来管理 队列和交换机
	 * @return: AmqpAdmin
	 * @param: @return
	 * @author: zhb
	 * @throws 2016年4月14日下午3:11:42
	 */
	public @Bean AmqpAdmin amqpAdmin() {
		return new RabbitAdmin(connectionFactory);
	}

}
